Composite Builder

객체 하나를 생성하는데, 복수의 빌더가 사용되는 경우
class Person{
// 주소
std::string street_address, post_code, city;
// 직업
std::string company_name, position;
int annual_income=0;
Person() {}
};
위의 클래스에 대하여 4가지 빌더를 정의
PersonBuilderBase와 이를 상속하는
PersonBuilder, PersonAddressBuilder, PersonJobBuilder 클래스
class PersonBuilderBase{
protected:
Person& person; // Base Builder는 Person의 참조만 가질 뿐, 실제 저장소가 아님!(생성된 객체를 가지지 않음)
explicit PersonBuilderBase(Person& person): person(person) {}
public:
operator Person(){
return std::move(person);
}
PersonAddressBuilder lives() const;
PersonJobBuilder works() const; // 하위 빌더의 인터페이스를 리턴!
};
// PersonBuilder
class PersonBuilder: public PersonBuilderBase{
Person p;
public:
PersonBuilder(): PersonBuilderBase{p} {}
};
// PersonAddressBuilder
class PersonAddressBuilder: public PersonBuilderBase{
typedef PersonAddressBuilder self;
public:
explicit PersonAddressBuilder(Person& person): PersonBuilderBase{person} {}
self& at(std::string street_address){
person.street_address=street_address;
return *this;
}
self& with_postcode(std::string post_code){
// ...
}
self& in(std::string city){
// ...
}
};
세 개의 Builder 클래스에서 Person private 멤버에 접근할 수 있도록 friend로 선언해야 한다.
// 사용
Person p=Person::build() // builder 반환
.lives().at("123 London Road")
.with_postcode("SW1 1GB")
.in("London") // PersonAddressBuilder
.works().at("PragmaSoft")
.as_a("Consultant")
.earning(10e6); // PersonJobBuilder